package jus.aor.talk.ui.client;
import java.rmi.RemoteException;
import java.util.*;

import jus.util.assertion.Require;

/**
* La classe TalkEventIntervenantAdaptator définit l'aspect bean de l'Intervenant
* @author	Philippe Morat
* @email	Philippe.Morat@imag.fr
* @see		Talk
* @see		TalkEventGenerator, IntervenantEventListener
* @see <a href=BeanTalk.txt>BeanTalk</a>
*/
public class TalkEventIntervenantAdaptator implements _TalkEventIntervenantAdaptator, java.io.Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -6349609715811215418L;
	/**
	* l'intervenant auquel est associé cet adaptateur
	*/
	protected _IntervenantComposant intervenant;
	/**
	* constructeur d'un TalkEventIntervenantAdaptator
	* <dt><b> Requires: </b><code>
	* <dd>  argsValide : intervenant!=null
	* </code>
	*/
	public TalkEventIntervenantAdaptator(_IntervenantComposant intervenant) throws Require{
		if(intervenant==null) {throw new Require(this.getClass()+" TalkEventIntervenantAdaptator");}
		this.intervenant=intervenant;
	}
	/**
	* l'ensemble des abonnés aux évènements Talk
	*/
	protected Vector<IntervenantEventListener> listener = new Vector<IntervenantEventListener>();
	/**
	* prise en compte d'un abonnement
	*/
	public void addIntervenantEventListener(IntervenantEventListener E) {
		if(!listener.contains(E)) {
			listener.addElement(E);
		}
	}
	/**
	* résiliation d'un abonnement
	*/
	public void removeIntervenantEventListener(IntervenantEventListener E) {
		listener.removeElement(E);
	}
	/**
	* notification aux abonnés de l'émission de l'évènement IntervenantEventWarning
	*/
	protected void fireIntervenantEventWarning(IntervenantEventWarning E) {
		for(IntervenantEventListener e : listener) e.warning(E);
	}
	/**
	* notification aux abonnés de l'émission de l'évènement IntervenantEventState1
	*/
	public void fireIntervenantEventState1(IntervenantEventState1 E) {
		for(IntervenantEventListener e : listener) e.gotoState1(E);
	}
	/**
	* notification aux abonnés de l'émission de l'évènement IntervenantEventState2
	*/
	public void fireIntervenantEventState2(IntervenantEventState2 E) {
		for(IntervenantEventListener e : listener) e.gotoState2(E);
	}
	/**
	* réception de la notification d'un évènement TalkEventEnter
	*/
	public void enter(TalkEventEnter e) {
		try{
			intervenant.init(e.prenom,e.nom);
			if(intervenant.enter(e.getForum())) {
				fireIntervenantEventState2(new IntervenantEventState2(this));
			}else{
				fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Enter : forum="+e.getForum()));
			}
		}catch(Require x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Enter : forum="+e.getForum()));			
		}
		catch(Exception x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Enter : forum="+e.getForum()));			
		}
	}
	/**
	* réception de la notification d'un évènement TalkEventLeave
	*/
	public void leave(TalkEventLeave e) {
		try{
			if(intervenant.leave()) {
				fireIntervenantEventState1(new IntervenantEventState1(this));
			} else {
				fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Leave"));							
			}
		}catch(Require x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Leave"));			
		}
		catch(Exception x) {
			System.out.println(x);	
		}
	}
	/**
	* réception de la notification d'un évènement TalkEventLeave
	*/
	public void vacation(TalkEventVacation e) {
		try{
			if(intervenant.vacation()) {
				fireIntervenantEventState1(new IntervenantEventState1(this));
			} else {
				fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Vacation"));							
			}
		}catch(Require x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Vacation"));			
		}
		catch(Exception x) {
			System.out.println(x);	
		}
	}
	/**
	* réception de la notification d'un évènement TalkEventQuit
	*/
	public void quit(TalkEventQuit e) {
		try{
			intervenant.quit();
		}catch(Require x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Quit"));			
		}
		catch(Exception x) {
			System.out.println(x);	
		}
	}
	/**
	* réception de la notification d'un évènement TalkEventSay
	*/
	public void say(TalkEventSay e) {
		try{
			intervenant.say(e.getTexte());
		}catch(Require x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Say"));			
		}
		catch(Exception x) {
			System.out.println(x);	
		}
	}
	/**
	* réception de la notification d'un évènement TalkEventWho
	*/
	public void who(TalkEventWho e) {
		try{
			String message = intervenant.who();
			listen(message);
		}catch(Require x) {
			fireIntervenantEventWarning(new IntervenantEventWarning(this,"Erreur dans Who"));			
		}
		catch(Exception x) {
			System.out.println(x);	
		}
	}
	/**
	* réception d'un message en provenance du forum
	* notification aux abonnés de l'émission de l'évènement IntervenantEventListen
	*/
	public void listen(String message) throws Require  {
		if(message==null) {throw new Require(this.getClass()+" listen");}
		IntervenantEventListen t = new IntervenantEventListen(this,message);
		for(IntervenantEventListener e : listener) e.listen(t);
	}
	/* (non-Javadoc)
	 * @see jus.aor.talk.ui.client._TalkEventIntervenantAdaptator#gotoState1()
	 */
	public void gotoState1() {
		for(IntervenantEventListener e : listener) e.gotoState1(new IntervenantEventState1(this));		
	}
	/* (non-Javadoc)
	 * @see jus.aor.talk.ui.client._TalkEventIntervenantAdaptator#gotoState2()
	 */
	public void gotoState2() {
		for(IntervenantEventListener e : listener) e.gotoState2(new IntervenantEventState2(this));		
	}
}

